/*
 * Copyright (c) 2005, 2014 vacoor
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 */
package org.vacoor.nothing.web.service;

import org.vacoor.nothing.web.domain.Filters;
import org.vacoor.nothing.web.domain.Page;
import org.vacoor.nothing.web.domain.Pageable;
import org.vacoor.nothing.web.domain.Sort;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * CRUD
 *
 * @author vacoor
 */
public interface CrudService<E, ID extends Serializable> {

    /**
     * 根据 ID 检索一个实体
     *
     * @param id 唯一标识
     */
    E find(ID id);

    /**
     * 根据给定属性及值检索一个唯一实体
     *
     * @param prop  属性名称
     * @param value 属性值
     */
    E findOne(String prop, Object value);

    /**
     * 根据给定的条件检索一个唯一实体
     *
     * @param params 条件参数
     * @return 符合条件的唯一实体
     */
    E findOne(Map<String, Object> params);

    /**
     * 获取符合给定属性和值的实体集合
     *
     * @param prop  属性
     * @param value 属性值
     * @return 符合条件的所有实体
     */
    List<E> findMany(String prop, Object value);

    /**
     * 获取符合给定的过滤器和排序的实体集合
     *
     * @param filters 过滤器
     * @param sort    排序
     * @return 过滤后实体
     */
    List<E> findMany(Filters filters, Sort sort);

    /**
     * 返回给定分页参数下符合给定过滤器的实体集合
     *
     * @param filters  过滤器
     * @param pageable 分页参数
     */
    List<E> findMany(Filters filters, Pageable pageable);

    List<E> findMany(Map<String, Object> params);

    /**
     * 获取所有的实体集合
     */
    List<E> findAll();

    /**
     * 分页查询并且统计
     *
     * @param filters  过滤器
     * @param pageable 分页参数
     * @return 分页结果
     */
    Page<E> findPage(Filters filters, Pageable pageable);

    /**
     * 统计所有结果集
     *
     * @return 结果集数量
     */
    int count();

    /**
     * 统计符合条件的结果集
     *
     * @param prop  属性
     * @param value 属性值
     * @return 结果集数量
     */
    int count(String prop, Object value);

    /**
     * 使用给定的过滤器统计
     *
     * @param filters 统计过滤器
     * @return 结果集数量
     */
    int count(Filters filters);

    /**
     * 统计符合条件的结果集
     *
     * @param params 过滤参数
     * @return 结果集数量
     */
    int count(Map<String, Object> params);

    void save(E e);

    void update(E e);

    void delete(E e);

    void delete(ID id);

    void delete(ID[] ids);

    void delete(String property, Object value);

    void delete(Map<String, Object> params);
}
